/*
 * EJERCICIO:
 * - Crea ejemplos de funciones básicas que representen las diferentes
 *   posibilidades del lenguaje:
 *   Sin parámetros ni retorno, con uno o varios parámetros, con retorno...
 * - Comprueba si puedes crear funciones dentro de funciones.
 * - Utiliza algún ejemplo de funciones ya creadas en el lenguaje.
 * - Pon a prueba el concepto de variable LOCAL y GLOBAL.
 * - Debes hacer print por consola del resultado de todos los ejemplos.
 *   (y tener en cuenta que cada lenguaje puede poseer más o menos posibilidades)
 *
 * DIFICULTAD EXTRA (opcional):
 * Crea una función que reciba dos parámetros de tipo cadena de texto y retorne un número.
 * - La función imprime todos los números del 1 al 100. Teniendo en cuenta que:
 *   - Si el número es múltiplo de 3, muestra la cadena de texto del primer parámetro.
 *   - Si el número es múltiplo de 5, muestra la cadena de texto del segundo parámetro.
 *   - Si el número es múltiplo de 3 y de 5, muestra las dos cadenas de texto concatenadas.
 *   - La función retorna el número de veces que se ha impreso el número en lugar de los textos.
 *
 * Presta especial atención a la sintaxis que debes utilizar en cada uno de los casos.
 * Cada lenguaje sigue una convenciones que debes de respetar para que el código se entienda.
 */

use std::cmp;


fn saludar() {
    println!("Hola, Rust!");
}


fn sumar(a: i32, b: i32) {
    let suma = a + b;
    println!("Suma: {}", suma);
}


fn multiplicar(a: i32, b: i32) -> i32 {
    a * b
}


fn externa() {
    fn interna() {
        println!("Estoy dentro de una función externa");
    }
    interna();
}


fn demo_max() {
    let maximo = cmp::max(3, 5);
    println!("El máximo entre 3 y 5 es: {}", maximo);
}


static GLOBAL: i32 = 10;

fn usar_variable_global() {
    println!("Variable global: {}", GLOBAL);
}

fn usar_variable_local() {
    let local = 5;
    println!("Variable local: {}", local);
}

//EJERCICIO EXTRA
/* 
* DIFICULTAD EXTRA (opcional):
* Crea una función que reciba dos parámetros de tipo cadena de texto y retorne un número.
* - La función imprime todos los números del 1 al 100. Teniendo en cuenta que:
*   - Si el número es múltiplo de 3, muestra la cadena de texto del primer parámetro.
*   - Si el número es múltiplo de 5, muestra la cadena de texto del segundo parámetro.
*   - Si el número es múltiplo de 3 y de 5, muestra las dos cadenas de texto concatenadas.
*   - La función retorna el número de veces que se ha impreso el número en lugar de los textos.
*
* Presta especial atención a la sintaxis que debes utilizar en cada uno de los casos.
* Cada lenguaje sigue una convenciones que debes de respetar para que el código se entienda.
*/

fn ejercicio_extra(cadena_uno: String, cadena_dos: String) -> i32 {
    let mut contador = 0;
    for i in 1..100 {
        if i % 3 == 0 {
            println!("{}", cadena_uno);
        } else if i % 5 == 0 {
            println!("{}", cadena_dos);
        } else if i % 3 == 0 && i % 5 == 0 {
            println!("{}{}", cadena_uno, cadena_dos);
        } else if i % 3 != 0 && i % 5 != 0 {
            contador += 1;
            println!("{}", i);
        }
    }
    println!("El contador vale: {}", contador);
    return contador;
}




fn main() {
    saludar();
    sumar(3, 7);
    println!("Multiplicación: {}", multiplicar(4, 5));
    externa();
    demo_max();
    usar_variable_global();
    usar_variable_local();
    ejercicio_extra("Hola".to_string(), "Mundo".to_string());
}







